/*******************************************************************************
 * Classe Decor : classe de création du décor sur lequel se déroule le jeu
 ******************************************************************************/
package ElementsDeJeu;

import Armes.BombeFertile;
import java.awt.*;
import javax.swing.*;
import prjintwg.Fenetre;

/**
 *
 * @author W&G
 */
public class Decor extends JComponent {

    private Fenetre fenetre;//Fenetre du programme
    /*Tableau a deux dimensions contenant de valeurs booléenne relatives au
     décor (a dessiner ou non) par regroupenent de deux pixels dans chaque
     direction*/
    private boolean[][] terrain = new boolean[536][370];
    private double probabilite = 0;//Probabilité de dessiner un pixel
    private int etat = 0;//Etat d'un pixel
    private volatile boolean enJeu = false;//Dit si le decor est en jeu
/**
 * Constructeur du décor
 * @param fenetre Fenetre du programme
 */
    public Decor(Fenetre fenetre) {
        this.fenetre = fenetre;
        genererTerrain();
    }
/**
 * Génère le terrain
 */
    private void genererTerrain() {
        int jPrecedent1 = 0;
        int jPrecedent2 = (int) ((Math.random() * 100) + 150);
        for (int j = 0; j < jPrecedent2; j++) {
            terrain[0][j] = true;
            jPrecedent1 = j;
        }
        jPrecedent2 = jPrecedent1;
        etat = (int) (Math.random() * 3);
        for (int i = 0; i < terrain.length - 1; i++) {
            if (jPrecedent1 > 365) {
                jPrecedent1 = 345;
            } else if (jPrecedent1 < 45) {
                jPrecedent1 = 60;
            }
            for (int j = 0; j < jPrecedent2; j++) {
                terrain[i][j] = true;
            }
            if ((Math.random() < probabilite) || (jPrecedent1 > 350 || jPrecedent1 < 80)) {
                etat = (int) (Math.random() * 3);
                probabilite = 0;
            } else {
                probabilite += 0.002;
            }
            jPrecedent1 += (int) (etat - 1);
            jPrecedent2 = jPrecedent1;
        }
    }
/**
 * Retourne le terrain
 * @return Retourne le terrain
 */
    public boolean[][] getTerrain() {
        return terrain;
    }
/**
 * Retourne si le terrain est en jeu
 * @return Retourne si le terrain est en jeu
 */
    public boolean isEnJeu() {
        return enJeu;
    }
/**
 * Définit si le terrain est en jeu ou non
 * @param enJeu valeur booléenne définissant si le terrain est en jeu ou non
 */
    public void setEnJeu(boolean enJeu) {
        this.enJeu = enJeu;
    }
/**
 * Retourne la position y la plus haute pour un x
 * @param x position en x désirée
 * @return Retourne la position y
 */
    public int getTerrainY(int x) {
        int posY = 0;
        for (int j = 369; !terrain[x][j]; j--) {
            posY = j;
        }
        return posY;
    }

    @Override
    public void paintComponent(Graphics g) {//Dessine le décor
        g.setColor(Color.WHITE);
        if (enJeu) {
            int varx;
            int vary;
            int varx1;
            int vary1;
            int varx2;
            int vary2;
            int varx3;
            int vary3;
            int varx4;
            int vary4;
            int varx5;
            int vary5;

            for (int i = 0; i < 80; i++) {
                for (int j = 0; j < 160; j++) {
                    varx = Math.max(Math.min(fenetre.getPnlJeu().getProjectile().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                    vary = Math.max(Math.min(fenetre.getPnlJeu().getProjectile().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                    if (fenetre.getPnlJeu().getProjectile().getClass().equals(BombeFertile.class)) {
                        //                 fenetre.getPnlJeu().getBF().isExplose();
                        if (fenetre.getPnlJeu().getBF().isExplose()) {
                            varx1 = Math.max(Math.min(fenetre.getPnlJeu().getSB1().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                            vary1 = Math.max(Math.min(fenetre.getPnlJeu().getSB1().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                            varx2 = Math.max(Math.min(fenetre.getPnlJeu().getSB2().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                            vary2 = Math.max(Math.min(fenetre.getPnlJeu().getSB2().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                            varx3 = Math.max(Math.min(fenetre.getPnlJeu().getSB3().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                            vary3 = Math.max(Math.min(fenetre.getPnlJeu().getSB3().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                            varx4 = Math.max(Math.min(fenetre.getPnlJeu().getSB4().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                            vary4 = Math.max(Math.min(fenetre.getPnlJeu().getSB4().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                            varx5 = Math.max(Math.min(fenetre.getPnlJeu().getSB5().getPositionX() / 2 - 40 + i, terrain.length - 1), 0);
                            vary5 = Math.max(Math.min(fenetre.getPnlJeu().getSB5().getPositionY() - 80 + j, terrain[i].length - 1), 0);
                            if (terrain[varx1][vary1]) {
                                g.fillRect(varx1 * 2, fenetre.getHeight() - vary1, 2, 1);
                            }
                            if (terrain[varx2][vary2]) {
                                g.fillRect(varx2 * 2, fenetre.getHeight() - vary2, 2, 1);
                            }
                            if (terrain[varx3][vary3]) {
                                g.fillRect(varx3 * 2, fenetre.getHeight() - vary3, 2, 1);
                            }
                            if (terrain[varx5][vary4]) {
                                g.fillRect(varx4 * 2, fenetre.getHeight() - vary4, 2, 1);
                            }
                            if (terrain[varx5][vary5]) {
                                g.fillRect(varx5 * 2, fenetre.getHeight() - vary5, 2, 1);
                            }
                        }
                    }
                    if (terrain[varx][vary]) {
                        g.fillRect(varx * 2, fenetre.getHeight() - vary, 2, 1);
                    }
                }
            }
        } else {
            for (int i = 0; i < terrain.length; i++) {
                for (int j = 0; j < terrain[i].length; j++) {
                    if (terrain[i][j]) {
                        g.fillRect(i * 2, fenetre.getHeight() - j, 2, 1);
                    }
                }
            }
        }
        g.fillOval(fenetre.getWidth() / 2 - 20, fenetre.getHeight() / 10, 40, 40);
        g.setColor(Color.BLACK);
        g.fillOval(fenetre.getWidth() / 2 - 4, fenetre.getHeight() / 9, 25, 25);
    }
}
